{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV \n",
    "\n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183.0</td>\n",
       "      <td>64.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>94.0</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>168.0</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6    148.0           72.0           35.0    125.0  33.6   \n",
       "1            1     85.0           66.0           29.0    125.0  26.6   \n",
       "2            8    183.0           64.0           29.0    125.0  23.3   \n",
       "3            1     89.0           66.0           23.0     94.0  28.1   \n",
       "4            0    137.0           40.0           35.0    168.0  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv(\"FE_diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null float64\n",
      "BloodPressure               768 non-null float64\n",
      "SkinThickness               768 non-null float64\n",
      "Insulin                     768 non-null float64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(6), int64(3)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>121.656250</td>\n",
       "      <td>72.386719</td>\n",
       "      <td>29.108073</td>\n",
       "      <td>140.671875</td>\n",
       "      <td>32.455208</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>30.438286</td>\n",
       "      <td>12.096642</td>\n",
       "      <td>8.791221</td>\n",
       "      <td>86.383060</td>\n",
       "      <td>6.875177</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>44.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>14.000000</td>\n",
       "      <td>18.200000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.750000</td>\n",
       "      <td>64.000000</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>121.500000</td>\n",
       "      <td>27.500000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>125.000000</td>\n",
       "      <td>32.300000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  121.656250      72.386719      29.108073  140.671875   \n",
       "std       3.369578   30.438286      12.096642       8.791221   86.383060   \n",
       "min       0.000000   44.000000      24.000000       7.000000   14.000000   \n",
       "25%       1.000000   99.750000      64.000000      25.000000  121.500000   \n",
       "50%       3.000000  117.000000      72.000000      29.000000  125.000000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    32.455208                  0.471876   33.240885    0.348958  \n",
       "std      6.875177                  0.331329   11.760232    0.476951  \n",
       "min     18.200000                  0.078000   21.000000    0.000000  \n",
       "25%     27.500000                  0.243750   24.000000    0.000000  \n",
       "50%     32.300000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#  get labels\n",
    "y_train = train['Outcome']   \n",
    "X_train = train.drop([\"Outcome\"], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7721354166666666\n",
      "{'C': 0.01, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "#default SVC\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "penaltys = ['l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "grid = GridSearchCV(LinearSVC(), tuned_parameters, cv=5)\n",
    "\n",
    "grid.fit(X_train, y_train)\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7669270833333334\n",
      "{'C': 0.01}\n"
     ]
    }
   ],
   "source": [
    "#线性核-SVM\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = {'C': Cs}\n",
    "\n",
    "grid = GridSearchCV(SVC(kernel='linear'), tuned_parameters, n_jobs=-1, cv=5)\n",
    "\n",
    "grid.fit(X_train, y_train)\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与Logistic回归相比，线性SVM的正确率更低，性能更差，说明数据不是线性可分的。即原始样本空间不存在一个超平面能将训练样本分开。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "\n",
    "RBF核是SVM最常用的核函数。\n",
    "RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma。\n",
    "C越小，决策边界越平滑； \n",
    "gamma越小，决策边界越平滑。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
       "  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',\n",
       "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
       "  tol=0.001, verbose=False),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000.0], 'gamma': [0.0001, 0.001, 0.01, 0.1, 1, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000, 1e4]\n",
    "gammas = [0.0001, 0.001, 0.01, 0.1, 1, 100, 1000]\n",
    "\n",
    "tuned_parameters = {'C': Cs, 'gamma' : gammas}\n",
    "grid = GridSearchCV(SVC(kernel='rbf'), tuned_parameters, n_jobs=-1, cv=5)\n",
    "\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7682291666666666\n",
      "{'C': 100, 'gamma': 0.001}\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(grid.best_score_)\n",
    "print(grid.best_params_)\n",
    "\n",
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "#train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "#train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_gamms = len(gammas)\n",
    "\n",
    "test_scores =  np.array(test_means).reshape(n_Cs,number_gamms)\n",
    "#train_scores = np.array(train_means).reshape(n_Cs,number_gamms)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_gamms)\n",
    "#train_stds = np.array(train_stds).reshape(n_Cs,number_gamms)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(gammas):\n",
    "    pyplot.plot(x_axis, test_scores[:,i], label= gammas[i])\n",
    "    #pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = gammas[i] )\n",
    "    #pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuary' )\n",
    "pyplot.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
